package edu.ahut.corejava2.v1;

/**
 * 抽象类：
 * 1. 存在至少一个抽象方法 （没有花括号） 该方法需要用abstract标识
 * 2. 类需要用 abstract标识
 * 3. 该类不能实例化
 * 4. 继承的具体类需要实现所有的抽象方法
 * 5. 如果一个类继承了抽象类，但是不能实现所有的抽象方法，则该类必须是抽象类，
 */
abstract class Shape2D {
    abstract double area();

    void show() {
        System.out.println(area());
    }

}

class Circle extends Shape2D {


    double r;

    public Circle(double r) {
        this.r = r;
    }

    double area() {
        return Math.PI * r * r;
    }
}

class Triangle extends Shape2D {
    public Triangle(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    double area() {
        double s = (a + b + c) / 2;
        return Math.sqrt(s * (s - a) * (s - b) * (s - c));
    }

    double a, b, c;
}

class Rectangle extends Shape2D {
    double area() {
        return a * b;
    }

    double a, b;
}

public class AbstractClassDemo {
    public static void main(String[] args) {
        Shape2D[] shapes = new Shape2D[]{
                new Circle(10), new Triangle(3, 4, 5)
        };
        for (Shape2D shape : shapes) {
            shape.show();
        }

    }


}
